Purpose

The purpose of this analysis is to assess significant differences in GSVA scores for each hallmark pathways. Using ANOVA and subsequent Tukey tests, we ask:

  • For each pathway, are GSVA scores significantly different across tumor_descriptor? If so, which timepoints are significantly different?

We perform this using both GSVA scores calculated from RNA-seq libraries. Code is also flexible enough to test a different variable besides tumor_descriptor, etc.

Plots are inspired from here: https://yulab-smu.top/biomedical-knowledge-mining-book/enrichplot.html

Usage

To run this from the command line, use:

Rscript -e "rmarkdown::render('02-model-gsea-genomic-pairs.Rmd', clean = TRUE)" 

This assumes you are in the top directory of the repository.

Setup

Load libraries and define certain constants:

suppressPackageStartupMessages({
  library(tidyverse)
  library(broom)
  library(ggpubr)
})

Directories and File Inputs/Outputs

# Detect the ".git" folder. This will be in the project root directory.
# Use this as the root directory to ensure proper sourcing of functions
# no matter where this is called from.
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
analysis_dir <- file.path(root_dir, "analyses", "gene-set-enrichment-analysis") 
input_dir <- file.path(analysis_dir, "input")
files_dir <- file.path(root_dir, "analyses", "sample-distribution-analysis", "results")

# Input files
## Metadata file (histologies/clinical data)
metadata_file <- file.path(files_dir, "pbta.tsv") # file from add-sample-distribution module
matched_genomic_file <- file.path(files_dir, "genomic_assays_matched_time_points.tsv") # file from add-sample-distribution module
#matched_transcriptomic_file <- file.path(files_dir, "transcriptomic_assays_matched_time_points.tsv") # file from add-sample-distribution module

## GSEA scores
scores_file <- file.path(input_dir, "gsva_scores.tsv")

# File path to plots directory
plots_dir <-
  file.path(analysis_dir, "plots", "paired-genomic")
if (!dir.exists(plots_dir)) {
  dir.create(plots_dir)
}

# File path to results directory
results_dir <-
  file.path(analysis_dir, "results", "paired-genomic")
if (!dir.exists(results_dir)) {
  dir.create(results_dir)
}


# Significance testing universal threshold
SIGNIFICANCE_THRESHOLD <- 0.01

# This script contains functions used to modeling GSVA scores
source(paste0(analysis_dir, "/util/hallmark_models.R"))
source(paste0(analysis_dir, "/util/function-create-plots.R"))
source(paste0(root_dir, "/figures/scripts/theme.R"))

Read in data and process

######## Load input files
pbta <- readr::read_tsv(metadata_file, guess_max = 100000) %>% 
  filter(experimental_strategy == "RNA-Seq") %>% 
  filter(!is.na(RNA_library))
Rows: 4542 Columns: 62── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (38): Kids_First_Participant_ID, cg_multiple, cg_id, Kids_First_Biospecimen_ID, sample_id, aliquot_id, experimenta...
dbl (10): age_at_diagnosis_days, OS_days, EFS_days, age_last_update_days, normal_fraction, tumor_fraction, tumor_ploid...
lgl (14): gtex_group, gtex_subgroup, cell_line_composition, cell_line_passage, tumor_fraction_RFpurify_ABSOLUTE, tumor...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Read in matched_genomic_file and get the list of patients 
# with matched time points for the genomic assays
patient_list <- readr::read_tsv(matched_genomic_file, guess_max = 100000, show_col_types = FALSE) %>%
  subset(select = c("Kids_First_Participant_ID", "descriptors"))

#patient_list <- readr::read_tsv(matched_transcriptomic_file, guess_max = 100000, show_col_types = FALSE) %>%
#  subset(select = c("Kids_First_Participant_ID", "descriptors"))

# How many patients with paired assays?
print(length(unique(patient_list$Kids_First_Participant_ID)))
[1] 119
# Add metadata from pbta to patient list
metadata <- patient_list %>% 
  left_join(pbta, by = "Kids_First_Participant_ID")

# Read scores file
scores_file <- readr::read_tsv(scores_file) 
Rows: 193700 Columns: 4── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (3): Kids_First_Biospecimen_ID, hallmark_name, data_type
dbl (1): gsea_score
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Vector to order timepoints
timepoints <- c("Diagnosis", "Progressive", "Recurrence", "Deceased", "Second Malignancy", "Unavailable")

### Merge histology metadata with each set of gsea scores
metadata_with_gsva <- metadata %>%
  inner_join(scores_file, by = "Kids_First_Biospecimen_ID") %>% 
  mutate(tumor_descriptor = factor(tumor_descriptor),
         tumor_descriptor = fct_relevel(tumor_descriptor, timepoints))

# How many patients with paired assays?
print(length(unique(metadata_with_gsva$Kids_First_Participant_ID)))
[1] 111
# How many biospecimens per `RNA_library`?
print(table(metadata_with_gsva$RNA_library))

         poly-A poly-A stranded        stranded 
            500            5250            6600 
######## Find out unique RNA library types
rna_library_list <- metadata_with_gsva %>% pull(data_type) %>% unique()


######## Define output files for each unique rna library
tumor_descriptor_anova_outpaths <- lapply(rna_library_list, function(x){
  x<-gsub(" ", "_", x)
  x<-stringr::str_to_lower(gsub("-", "", x))
  file.path(results_dir, paste0("gsva_anova_", x, "_tumor_descriptor.tsv"))
})

tumor_descriptor_tukey_outpaths <- lapply(rna_library_list, function(x){
  x<-gsub(" ", "_", x)
  x<-stringr::str_to_lower(gsub("-", "", x))
  file.path(results_dir, paste0("gsva_tukey_", x, "_tumor_descriptor.tsv"))
})

ANOVA and Tukey analysis of GSVA scores

Here we perform a series of ANOVAs, for polyA and stranded libraries separately, to determine whether mean GSVA scores for a given grouping are significantly different across hallmarks (pathways). The given groupings examined here are cancer_group and tumor_descriptor. In other words, we perform an ANOVA (and associated posthoc Tukey test) for each hallmark as, hallmark ~ grouping. Users can specify the grouping variable.

rna_library_list <- sort(rna_library_list, decreasing = FALSE)
print(rna_library_list)

for(i in 1:length(rna_library_list)){
  print(i)
  
  rna_library = rna_library_list[i]
  print(rna_library)
  # find out the number of `tumor_descriptor` with this RNA library
  tumor_descriptor_n <- metadata_with_gsva %>%
    dplyr::filter(data_type == rna_library) %>%
    dplyr::pull(tumor_descriptor) %>% 
    unique() %>% length()
  
  # anova can only be run on factors with >=2 levels, so to avoid error, we give a if statement
  if(tumor_descriptor_n>=2){
    tumor_descriptor_model_results <- gsva_anova_tukey(metadata_with_gsva, tumor_descriptor, rna_library, SIGNIFICANCE_THRESHOLD) 
  
    ###########################################################################################
   
    # write out results
    readr::write_tsv(tumor_descriptor_model_results[["anova"]], tumor_descriptor_anova_outpaths[[i]])
    readr::write_tsv(tumor_descriptor_model_results[["tukey"]], tumor_descriptor_tukey_outpaths[[i]])
  
    # print results for viewing
    print(rna_library)
    print(head(tumor_descriptor_model_results))
  
    ################ plot results ########################################################
    ###### barplots ######################################################################
    ### tukey
  
    td_models <- unique(as.character(tumor_descriptor_model_results[["tukey"]]$comparison))
    td_models <- sort(td_models, decreasing = FALSE)
    print(td_models)
  
    for(t in seq_along(td_models)){
      print(t)

      # Re-order bars
      df <- tumor_descriptor_model_results[["tukey"]] %>%
        filter(comparison == td_models[t])
  
      df$hallmark_name <- factor(df$hallmark_name,
                                 levels = rev(unique(df$hallmark_name[order(df$tukey_p_value, decreasing = TRUE)]))) # Factor levels in increasing order

  
      name <- paste0(plots_dir, "/", "gsva_tukey_", rna_library_list[i], "-", td_models[t], "-tumor_descriptor_barplot.pdf")
      print(name)
      p <- create_barplot(df = df,
                          y_value = df$tukey_p_value,
                          title_value = "tukey_p_value",
                          rna_library = rna_library_list[i],
                          td_model_id = td_models[t])
      pdf(file = name, width = 12, height = 10)
      print(p)
      dev.off()
      }
  
    ### anova
    name <- paste0(plots_dir, "/", "gsva_anova_", rna_library_list[i], "-tumor_descriptor_barplot.pdf")
    print(name)
  
    # Re-order bars
    df <- tumor_descriptor_model_results[["anova"]]
    df$hallmark_name <- factor(df$hallmark_name,
                               levels = rev(unique(df$hallmark_name[order(df$anova_p_value, decreasing = TRUE)]))) # Factor levels in increasing order
    p <- create_barplot(df = df,
                        y_value = df$anova_p_value,
                        title_value = "anova_p_value", 
                        rna_library = rna_library_list[i],
                        td_model_id = NULL)
    pdf(file = name, width = 12, height = 10)
    print(p)
    dev.off()
  
    ###### dot plots ######################################################################
    ### tukey
    td_models <- unique(as.character(tumor_descriptor_model_results[["tukey"]]$comparison))
    td_models <- sort(td_models, decreasing = FALSE)
    print(td_models)
  
    for(t in seq_along(td_models)){
      print(t)

      # Re-order bars
      df <- tumor_descriptor_model_results[["tukey"]] %>%
        filter(comparison == td_models[t])
  
      name <- paste0(plots_dir, "/", "gsva_tukey_", rna_library_list[i], "-", td_models[t], "-tumor_descriptor_dotplot.pdf")
      print(name)
      p <- create_dotplot(df = df,
                          x_value = df$hallmark_name,
                          y_value = df$tukey_p_value,
                          title_value = "tukey_p_value",
                          rna_library = rna_library_list[i],
                          td_model_id = td_models[t])
      pdf(file = name, width = 12, height = 10)
      print(p)
      dev.off()
      }
    
    ### anova
    name <- paste0(plots_dir, "/", "gsva_anova_", rna_library, "-tumor_descriptor_dotplot.pdf")
    print(name)
    p <- create_dotplot(df = tumor_descriptor_model_results[["anova"]],
                        x_value = tumor_descriptor_model_results[["anova"]]$hallmark_name,
                        y_value = tumor_descriptor_model_results[["anova"]]$anova_p_value,
                        title_value = "anova_p_value",
                        rna_library = rna_library_list[i],
                        td_model_id = NULL)
    pdf(file = name, width = 12, height = 10)
    print(p)
    dev.off()
    }
}
rna_library_list <- sort(rna_library_list, decreasing = FALSE)
print(rna_library_list)
[1] "polya"          "polya_stranded" "stranded"      
for(i in 1:length(rna_library_list)){
  print(i)
  
  rna_library = rna_library_list[i]
  print(rna_library)
  # find out the number of `tumor_descriptor` with this RNA library
  tumor_descriptor_n <- metadata_with_gsva %>%
    dplyr::filter(data_type == rna_library) %>%
    dplyr::pull(tumor_descriptor) %>% 
    unique() %>% length()
  
  # anova can only be run on factors with >=2 levels, so to avoid error, we give a if statement
  if(tumor_descriptor_n>=2){
    tumor_descriptor_model_results <- gsva_anova_tukey(metadata_with_gsva, tumor_descriptor, rna_library, SIGNIFICANCE_THRESHOLD) 
  
    ###########################################################################################
   
    # write out results
    readr::write_tsv(tumor_descriptor_model_results[["anova"]], tumor_descriptor_anova_outpaths[[i]])
    readr::write_tsv(tumor_descriptor_model_results[["tukey"]], tumor_descriptor_tukey_outpaths[[i]])
  
    # print results for viewing
    print(rna_library)
    print(head(tumor_descriptor_model_results))
  
    ################ plot results ########################################################
    ###### barplots ######################################################################
    ### tukey
  
    td_models <- unique(as.character(tumor_descriptor_model_results[["tukey"]]$comparison))
    td_models <- sort(td_models, decreasing = FALSE)
    print(td_models)
  
    for(t in seq_along(td_models)){
      print(t)

      # Re-order bars
      df <- tumor_descriptor_model_results[["tukey"]] %>%
        filter(comparison == td_models[t])
  
      df$hallmark_name <- factor(df$hallmark_name,
                                 levels = rev(unique(df$hallmark_name[order(df$tukey_p_value, decreasing = TRUE)]))) # Factor levels in increasing order

  
      name <- paste0(plots_dir, "/", "gsva_tukey_", rna_library_list[i], "-", td_models[t], "-tumor_descriptor_barplot.pdf")
      print(name)
      p <- create_barplot(df = df,
                          y_value = df$tukey_p_value,
                          title_value = "tukey_p_value",
                          rna_library = rna_library_list[i],
                          td_model_id = td_models[t])
      pdf(file = name, width = 12, height = 10)
      print(p)
      dev.off()
      }
  
    ### anova
    name <- paste0(plots_dir, "/", "gsva_anova_", rna_library_list[i], "-tumor_descriptor_barplot.pdf")
    print(name)
  
    # Re-order bars
    df <- tumor_descriptor_model_results[["anova"]]
    df$hallmark_name <- factor(df$hallmark_name,
                               levels = rev(unique(df$hallmark_name[order(df$anova_p_value, decreasing = TRUE)]))) # Factor levels in increasing order
    p <- create_barplot(df = df,
                        y_value = df$anova_p_value,
                        title_value = "anova_p_value", 
                        rna_library = rna_library_list[i],
                        td_model_id = NULL)
    pdf(file = name, width = 12, height = 10)
    print(p)
    dev.off()
  
    ###### dot plots ######################################################################
    ### tukey
    td_models <- unique(as.character(tumor_descriptor_model_results[["tukey"]]$comparison))
    td_models <- sort(td_models, decreasing = FALSE)
    print(td_models)
  
    for(t in seq_along(td_models)){
      print(t)

      # Re-order bars
      df <- tumor_descriptor_model_results[["tukey"]] %>%
        filter(comparison == td_models[t])
  
      name <- paste0(plots_dir, "/", "gsva_tukey_", rna_library_list[i], "-", td_models[t], "-tumor_descriptor_dotplot.pdf")
      print(name)
      p <- create_dotplot(df = df,
                          x_value = df$hallmark_name,
                          y_value = df$tukey_p_value,
                          title_value = "tukey_p_value",
                          rna_library = rna_library_list[i],
                          td_model_id = td_models[t])
      pdf(file = name, width = 12, height = 10)
      print(p)
      dev.off()
      }
    
    ### anova
    name <- paste0(plots_dir, "/", "gsva_anova_", rna_library, "-tumor_descriptor_dotplot.pdf")
    print(name)
    p <- create_dotplot(df = tumor_descriptor_model_results[["anova"]],
                        x_value = tumor_descriptor_model_results[["anova"]]$hallmark_name,
                        y_value = tumor_descriptor_model_results[["anova"]]$anova_p_value,
                        title_value = "anova_p_value",
                        rna_library = rna_library_list[i],
                        td_model_id = NULL)
    pdf(file = name, width = 12, height = 10)
    print(p)
    dev.off()
    }
}
[1] 1
[1] "polya"
[1] 50
[1] "polya"
$anova

$tukey

[1] "Progressive-Diagnosis"
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya-Progressive-Diagnosis-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_anova_polya-tumor_descriptor_barplot.pdf"
[1] "Progressive-Diagnosis"
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya-Progressive-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_anova_polya-tumor_descriptor_dotplot.pdf"
[1] 2
[1] "polya_stranded"
[1] 50
[1] "polya_stranded"
$anova

$tukey

[1] "Deceased-Diagnosis"     "Deceased-Progressive"   "Deceased-Recurrence"    "Progressive-Diagnosis" 
[5] "Recurrence-Diagnosis"   "Recurrence-Progressive"
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Deceased-Diagnosis-tumor_descriptor_barplot.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Deceased-Progressive-tumor_descriptor_barplot.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Deceased-Recurrence-tumor_descriptor_barplot.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Progressive-Diagnosis-tumor_descriptor_barplot.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Recurrence-Diagnosis-tumor_descriptor_barplot.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Recurrence-Progressive-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_anova_polya_stranded-tumor_descriptor_barplot.pdf"
[1] "Deceased-Diagnosis"     "Deceased-Progressive"   "Deceased-Recurrence"    "Progressive-Diagnosis" 
[5] "Recurrence-Diagnosis"   "Recurrence-Progressive"
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Deceased-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Deceased-Progressive-tumor_descriptor_dotplot.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Deceased-Recurrence-tumor_descriptor_dotplot.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Progressive-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Recurrence-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_polya_stranded-Recurrence-Progressive-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_anova_polya_stranded-tumor_descriptor_dotplot.pdf"
[1] 3
[1] "stranded"
[1] 50
[1] "stranded"
$anova

$tukey

 [1] "Deceased-Diagnosis"            "Deceased-Progressive"          "Deceased-Recurrence"          
 [4] "Progressive-Diagnosis"         "Recurrence-Diagnosis"          "Recurrence-Progressive"       
 [7] "Second Malignancy-Deceased"    "Second Malignancy-Diagnosis"   "Second Malignancy-Progressive"
[10] "Second Malignancy-Recurrence"  "Unavailable-Deceased"          "Unavailable-Diagnosis"        
[13] "Unavailable-Progressive"       "Unavailable-Recurrence"        "Unavailable-Second Malignancy"
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Deceased-Diagnosis-tumor_descriptor_barplot.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Deceased-Progressive-tumor_descriptor_barplot.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Deceased-Recurrence-tumor_descriptor_barplot.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Progressive-Diagnosis-tumor_descriptor_barplot.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Recurrence-Diagnosis-tumor_descriptor_barplot.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Recurrence-Progressive-tumor_descriptor_barplot.pdf"
[1] 7
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Second Malignancy-Deceased-tumor_descriptor_barplot.pdf"
[1] 8
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Second Malignancy-Diagnosis-tumor_descriptor_barplot.pdf"
[1] 9
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Second Malignancy-Progressive-tumor_descriptor_barplot.pdf"
[1] 10
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Second Malignancy-Recurrence-tumor_descriptor_barplot.pdf"
[1] 11
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Unavailable-Deceased-tumor_descriptor_barplot.pdf"
[1] 12
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Unavailable-Diagnosis-tumor_descriptor_barplot.pdf"
[1] 13
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Unavailable-Progressive-tumor_descriptor_barplot.pdf"
[1] 14
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Unavailable-Recurrence-tumor_descriptor_barplot.pdf"
[1] 15
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Unavailable-Second Malignancy-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_anova_stranded-tumor_descriptor_barplot.pdf"
 [1] "Deceased-Diagnosis"            "Deceased-Progressive"          "Deceased-Recurrence"          
 [4] "Progressive-Diagnosis"         "Recurrence-Diagnosis"          "Recurrence-Progressive"       
 [7] "Second Malignancy-Deceased"    "Second Malignancy-Diagnosis"   "Second Malignancy-Progressive"
[10] "Second Malignancy-Recurrence"  "Unavailable-Deceased"          "Unavailable-Diagnosis"        
[13] "Unavailable-Progressive"       "Unavailable-Recurrence"        "Unavailable-Second Malignancy"
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Deceased-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Deceased-Progressive-tumor_descriptor_dotplot.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Deceased-Recurrence-tumor_descriptor_dotplot.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Progressive-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Recurrence-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Recurrence-Progressive-tumor_descriptor_dotplot.pdf"
[1] 7
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Second Malignancy-Deceased-tumor_descriptor_dotplot.pdf"
[1] 8
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Second Malignancy-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] 9
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Second Malignancy-Progressive-tumor_descriptor_dotplot.pdf"
[1] 10
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Second Malignancy-Recurrence-tumor_descriptor_dotplot.pdf"
[1] 11
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Unavailable-Deceased-tumor_descriptor_dotplot.pdf"
[1] 12
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Unavailable-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] 13
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Unavailable-Progressive-tumor_descriptor_dotplot.pdf"
[1] 14
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Unavailable-Recurrence-tumor_descriptor_dotplot.pdf"
[1] 15
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_tukey_stranded-Unavailable-Second Malignancy-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-genomic/gsva_anova_stranded-tumor_descriptor_dotplot.pdf"

LS0tCnRpdGxlOiAiR1NWQSBTY29yZSBNb2RlbGluZyIKYXV0aG9yOiAiQW50b25pYSBDaHJvbmkgPGNocm9uaWFAY2hvcC5lZHU+IGZvciBEM0IiCmRhdGU6ICIyMDIzIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCi0tLQoKIyMjIFB1cnBvc2UKClRoZSBwdXJwb3NlIG9mIHRoaXMgYW5hbHlzaXMgaXMgdG8gYXNzZXNzIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIEdTVkEgc2NvcmVzIGZvciBlYWNoIGhhbGxtYXJrIHBhdGh3YXlzLiBVc2luZyBBTk9WQSBhbmQgc3Vic2VxdWVudCBUdWtleSB0ZXN0cywgd2UgYXNrOgoKKyBGb3IgZWFjaCBwYXRod2F5LCBhcmUgR1NWQSBzY29yZXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgYWNyb3NzIGB0dW1vcl9kZXNjcmlwdG9yYD8gSWYgc28sIHdoaWNoIHRpbWVwb2ludHMgYXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50PwoKV2UgcGVyZm9ybSB0aGlzIHVzaW5nIGJvdGggR1NWQSBzY29yZXMgY2FsY3VsYXRlZCBmcm9tIFJOQS1zZXEgbGlicmFyaWVzLiBDb2RlIGlzIGFsc28gZmxleGlibGUgZW5vdWdoIHRvIHRlc3QgYSBkaWZmZXJlbnQgdmFyaWFibGUgYmVzaWRlcyBgdHVtb3JfZGVzY3JpcHRvcmAsIGV0Yy4KCgpQbG90cyBhcmUgaW5zcGlyZWQgZnJvbSBoZXJlOiBodHRwczovL3l1bGFiLXNtdS50b3AvYmlvbWVkaWNhbC1rbm93bGVkZ2UtbWluaW5nLWJvb2svZW5yaWNocGxvdC5odG1sCgojIyMgVXNhZ2UKClRvIHJ1biB0aGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdXNlOgpgYGAKUnNjcmlwdCAtZSAicm1hcmtkb3duOjpyZW5kZXIoJzAyLW1vZGVsLWdzZWEtZ2Vub21pYy1wYWlycy5SbWQnLCBjbGVhbiA9IFRSVUUpIiAKYGBgCl9UaGlzIGFzc3VtZXMgeW91IGFyZSBpbiB0aGUgdG9wIGRpcmVjdG9yeSBvZiB0aGUgcmVwb3NpdG9yeS5fCgojIFNldHVwCgpMb2FkIGxpYnJhcmllcyBhbmQgZGVmaW5lIGNlcnRhaW4gY29uc3RhbnRzOgoKYGBge3IgbG9hZC1saWJyYXJ5fQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkodGlkeXZlcnNlKQogIGxpYnJhcnkoYnJvb20pCiAgbGlicmFyeShnZ3B1YnIpCn0pCmBgYAoKCiMjIERpcmVjdG9yaWVzIGFuZCBGaWxlIElucHV0cy9PdXRwdXRzCgpgYGB7ciBzZXQtZGlyLWFuZC1maWxlLW5hbWVzfQojIERldGVjdCB0aGUgIi5naXQiIGZvbGRlci4gVGhpcyB3aWxsIGJlIGluIHRoZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LgojIFVzZSB0aGlzIGFzIHRoZSByb290IGRpcmVjdG9yeSB0byBlbnN1cmUgcHJvcGVyIHNvdXJjaW5nIG9mIGZ1bmN0aW9ucwojIG5vIG1hdHRlciB3aGVyZSB0aGlzIGlzIGNhbGxlZCBmcm9tLgpyb290X2RpciA8LSBycHJvanJvb3Q6OmZpbmRfcm9vdChycHJvanJvb3Q6Omhhc19kaXIoIi5naXQiKSkKYW5hbHlzaXNfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgImFuYWx5c2VzIiwgImdlbmUtc2V0LWVucmljaG1lbnQtYW5hbHlzaXMiKSAKaW5wdXRfZGlyIDwtIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJpbnB1dCIpCmZpbGVzX2RpciA8LSBmaWxlLnBhdGgocm9vdF9kaXIsICJhbmFseXNlcyIsICJzYW1wbGUtZGlzdHJpYnV0aW9uLWFuYWx5c2lzIiwgInJlc3VsdHMiKQoKIyBJbnB1dCBmaWxlcwojIyBNZXRhZGF0YSBmaWxlIChoaXN0b2xvZ2llcy9jbGluaWNhbCBkYXRhKQptZXRhZGF0YV9maWxlIDwtIGZpbGUucGF0aChmaWxlc19kaXIsICJwYnRhLnRzdiIpICMgZmlsZSBmcm9tIGFkZC1zYW1wbGUtZGlzdHJpYnV0aW9uIG1vZHVsZQptYXRjaGVkX2dlbm9taWNfZmlsZSA8LSBmaWxlLnBhdGgoZmlsZXNfZGlyLCAiZ2Vub21pY19hc3NheXNfbWF0Y2hlZF90aW1lX3BvaW50cy50c3YiKSAjIGZpbGUgZnJvbSBhZGQtc2FtcGxlLWRpc3RyaWJ1dGlvbiBtb2R1bGUKI21hdGNoZWRfdHJhbnNjcmlwdG9taWNfZmlsZSA8LSBmaWxlLnBhdGgoZmlsZXNfZGlyLCAidHJhbnNjcmlwdG9taWNfYXNzYXlzX21hdGNoZWRfdGltZV9wb2ludHMudHN2IikgIyBmaWxlIGZyb20gYWRkLXNhbXBsZS1kaXN0cmlidXRpb24gbW9kdWxlCgojIyBHU0VBIHNjb3JlcwpzY29yZXNfZmlsZSA8LSBmaWxlLnBhdGgoaW5wdXRfZGlyLCAiZ3N2YV9zY29yZXMudHN2IikKCiMgRmlsZSBwYXRoIHRvIHBsb3RzIGRpcmVjdG9yeQpwbG90c19kaXIgPC0KICBmaWxlLnBhdGgoYW5hbHlzaXNfZGlyLCAicGxvdHMiLCAicGFpcmVkLWdlbm9taWMiKQppZiAoIWRpci5leGlzdHMocGxvdHNfZGlyKSkgewogIGRpci5jcmVhdGUocGxvdHNfZGlyKQp9CgojIEZpbGUgcGF0aCB0byByZXN1bHRzIGRpcmVjdG9yeQpyZXN1bHRzX2RpciA8LQogIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJyZXN1bHRzIiwgInBhaXJlZC1nZW5vbWljIikKaWYgKCFkaXIuZXhpc3RzKHJlc3VsdHNfZGlyKSkgewogIGRpci5jcmVhdGUocmVzdWx0c19kaXIpCn0KCgojIFNpZ25pZmljYW5jZSB0ZXN0aW5nIHVuaXZlcnNhbCB0aHJlc2hvbGQKU0lHTklGSUNBTkNFX1RIUkVTSE9MRCA8LSAwLjAxCgojIFRoaXMgc2NyaXB0IGNvbnRhaW5zIGZ1bmN0aW9ucyB1c2VkIHRvIG1vZGVsaW5nIEdTVkEgc2NvcmVzCnNvdXJjZShwYXN0ZTAoYW5hbHlzaXNfZGlyLCAiL3V0aWwvaGFsbG1hcmtfbW9kZWxzLlIiKSkKc291cmNlKHBhc3RlMChhbmFseXNpc19kaXIsICIvdXRpbC9mdW5jdGlvbi1jcmVhdGUtcGxvdHMuUiIpKQpzb3VyY2UocGFzdGUwKHJvb3RfZGlyLCAiL2ZpZ3VyZXMvc2NyaXB0cy90aGVtZS5SIikpCmBgYAoKIyMgUmVhZCBpbiBkYXRhIGFuZCBwcm9jZXNzCgpgYGB7ciByZWFkLWlucHV0LWZpbGVzfQojIyMjIyMjIyBMb2FkIGlucHV0IGZpbGVzCnBidGEgPC0gcmVhZHI6OnJlYWRfdHN2KG1ldGFkYXRhX2ZpbGUsIGd1ZXNzX21heCA9IDEwMDAwMCkgJT4lIAogIGZpbHRlcihleHBlcmltZW50YWxfc3RyYXRlZ3kgPT0gIlJOQS1TZXEiKSAlPiUgCiAgZmlsdGVyKCFpcy5uYShSTkFfbGlicmFyeSkpCgojIFJlYWQgaW4gbWF0Y2hlZF9nZW5vbWljX2ZpbGUgYW5kIGdldCB0aGUgbGlzdCBvZiBwYXRpZW50cyAKIyB3aXRoIG1hdGNoZWQgdGltZSBwb2ludHMgZm9yIHRoZSBnZW5vbWljIGFzc2F5cwpwYXRpZW50X2xpc3QgPC0gcmVhZHI6OnJlYWRfdHN2KG1hdGNoZWRfZ2Vub21pY19maWxlLCBndWVzc19tYXggPSAxMDAwMDAsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpICU+JQogIHN1YnNldChzZWxlY3QgPSBjKCJLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEIiwgImRlc2NyaXB0b3JzIikpCgojcGF0aWVudF9saXN0IDwtIHJlYWRyOjpyZWFkX3RzdihtYXRjaGVkX3RyYW5zY3JpcHRvbWljX2ZpbGUsIGd1ZXNzX21heCA9IDEwMDAwMCwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkgJT4lCiMgIHN1YnNldChzZWxlY3QgPSBjKCJLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEIiwgImRlc2NyaXB0b3JzIikpCgojIEhvdyBtYW55IHBhdGllbnRzIHdpdGggcGFpcmVkIGFzc2F5cz8KcHJpbnQobGVuZ3RoKHVuaXF1ZShwYXRpZW50X2xpc3QkS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCkpKQoKIyBBZGQgbWV0YWRhdGEgZnJvbSBwYnRhIHRvIHBhdGllbnQgbGlzdAptZXRhZGF0YSA8LSBwYXRpZW50X2xpc3QgJT4lIAogIGxlZnRfam9pbihwYnRhLCBieSA9ICJLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEIikKCiMgUmVhZCBzY29yZXMgZmlsZQpzY29yZXNfZmlsZSA8LSByZWFkcjo6cmVhZF90c3Yoc2NvcmVzX2ZpbGUpIAoKIyBWZWN0b3IgdG8gb3JkZXIgdGltZXBvaW50cwp0aW1lcG9pbnRzIDwtIGMoIkRpYWdub3NpcyIsICJQcm9ncmVzc2l2ZSIsICJSZWN1cnJlbmNlIiwgIkRlY2Vhc2VkIiwgIlNlY29uZCBNYWxpZ25hbmN5IiwgIlVuYXZhaWxhYmxlIikKCiMjIyBNZXJnZSBoaXN0b2xvZ3kgbWV0YWRhdGEgd2l0aCBlYWNoIHNldCBvZiBnc2VhIHNjb3JlcwptZXRhZGF0YV93aXRoX2dzdmEgPC0gbWV0YWRhdGEgJT4lCiAgaW5uZXJfam9pbihzY29yZXNfZmlsZSwgYnkgPSAiS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCIpICU+JSAKICBtdXRhdGUodHVtb3JfZGVzY3JpcHRvciA9IGZhY3Rvcih0dW1vcl9kZXNjcmlwdG9yKSwKICAgICAgICAgdHVtb3JfZGVzY3JpcHRvciA9IGZjdF9yZWxldmVsKHR1bW9yX2Rlc2NyaXB0b3IsIHRpbWVwb2ludHMpKQoKIyBIb3cgbWFueSBwYXRpZW50cyB3aXRoIHBhaXJlZCBhc3NheXM/CnByaW50KGxlbmd0aCh1bmlxdWUobWV0YWRhdGFfd2l0aF9nc3ZhJEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpKSkKCiMgSG93IG1hbnkgYmlvc3BlY2ltZW5zIHBlciBgUk5BX2xpYnJhcnlgPwpwcmludCh0YWJsZShtZXRhZGF0YV93aXRoX2dzdmEkUk5BX2xpYnJhcnkpKQoKIyMjIyMjIyMgRmluZCBvdXQgdW5pcXVlIFJOQSBsaWJyYXJ5IHR5cGVzCnJuYV9saWJyYXJ5X2xpc3QgPC0gbWV0YWRhdGFfd2l0aF9nc3ZhICU+JSBwdWxsKGRhdGFfdHlwZSkgJT4lIHVuaXF1ZSgpCgoKIyMjIyMjIyMgRGVmaW5lIG91dHB1dCBmaWxlcyBmb3IgZWFjaCB1bmlxdWUgcm5hIGxpYnJhcnkKdHVtb3JfZGVzY3JpcHRvcl9hbm92YV9vdXRwYXRocyA8LSBsYXBwbHkocm5hX2xpYnJhcnlfbGlzdCwgZnVuY3Rpb24oeCl7CiAgeDwtZ3N1YigiICIsICJfIiwgeCkKICB4PC1zdHJpbmdyOjpzdHJfdG9fbG93ZXIoZ3N1YigiLSIsICIiLCB4KSkKICBmaWxlLnBhdGgocmVzdWx0c19kaXIsIHBhc3RlMCgiZ3N2YV9hbm92YV8iLCB4LCAiX3R1bW9yX2Rlc2NyaXB0b3IudHN2IikpCn0pCgp0dW1vcl9kZXNjcmlwdG9yX3R1a2V5X291dHBhdGhzIDwtIGxhcHBseShybmFfbGlicmFyeV9saXN0LCBmdW5jdGlvbih4KXsKICB4PC1nc3ViKCIgIiwgIl8iLCB4KQogIHg8LXN0cmluZ3I6OnN0cl90b19sb3dlcihnc3ViKCItIiwgIiIsIHgpKQogIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJnc3ZhX3R1a2V5XyIsIHgsICJfdHVtb3JfZGVzY3JpcHRvci50c3YiKSkKfSkKCmBgYAoKCiMjIyBBTk9WQSBhbmQgVHVrZXkgYW5hbHlzaXMgb2YgR1NWQSBzY29yZXMKCkhlcmUgd2UgcGVyZm9ybSBhIHNlcmllcyBvZiBBTk9WQXMsIGZvciBwb2x5QSBhbmQgc3RyYW5kZWQgbGlicmFyaWVzIHNlcGFyYXRlbHksIHRvIGRldGVybWluZSB3aGV0aGVyIG1lYW4gR1NWQSBzY29yZXMgZm9yIGEgZ2l2ZW4gZ3JvdXBpbmcgYXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGFjcm9zcyBoYWxsbWFya3MgKHBhdGh3YXlzKS4gVGhlIGdpdmVuIGdyb3VwaW5ncyBleGFtaW5lZCBoZXJlIGFyZSBgY2FuY2VyX2dyb3VwYCBhbmQgYHR1bW9yX2Rlc2NyaXB0b3JgLiAKSW4gb3RoZXIgd29yZHMsIHdlIHBlcmZvcm0gYW4gQU5PVkEgKGFuZCBhc3NvY2lhdGVkIHBvc3Rob2MgVHVrZXkgdGVzdCkgZm9yIGVhY2ggaGFsbG1hcmsgYXMsIGBoYWxsbWFyayB+IGdyb3VwaW5nYC4gVXNlcnMgY2FuIHNwZWNpZnkgdGhlIGdyb3VwaW5nIHZhcmlhYmxlLgoKCmBgYHtyLCBhb3YtcGVyZm9ybS1wbG90LCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEwLCBmaWcuZnVsbHdpZHRoID0gVFJVRSwgZWNobyA9IFRSVUV9CnJuYV9saWJyYXJ5X2xpc3QgPC0gc29ydChybmFfbGlicmFyeV9saXN0LCBkZWNyZWFzaW5nID0gRkFMU0UpCnByaW50KHJuYV9saWJyYXJ5X2xpc3QpCgpmb3IoaSBpbiAxOmxlbmd0aChybmFfbGlicmFyeV9saXN0KSl7CiAgcHJpbnQoaSkKICAKICBybmFfbGlicmFyeSA9IHJuYV9saWJyYXJ5X2xpc3RbaV0KICBwcmludChybmFfbGlicmFyeSkKICAjIGZpbmQgb3V0IHRoZSBudW1iZXIgb2YgYHR1bW9yX2Rlc2NyaXB0b3JgIHdpdGggdGhpcyBSTkEgbGlicmFyeQogIHR1bW9yX2Rlc2NyaXB0b3JfbiA8LSBtZXRhZGF0YV93aXRoX2dzdmEgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGRhdGFfdHlwZSA9PSBybmFfbGlicmFyeSkgJT4lCiAgICBkcGx5cjo6cHVsbCh0dW1vcl9kZXNjcmlwdG9yKSAlPiUgCiAgICB1bmlxdWUoKSAlPiUgbGVuZ3RoKCkKICAKICAjIGFub3ZhIGNhbiBvbmx5IGJlIHJ1biBvbiBmYWN0b3JzIHdpdGggPj0yIGxldmVscywgc28gdG8gYXZvaWQgZXJyb3IsIHdlIGdpdmUgYSBpZiBzdGF0ZW1lbnQKICBpZih0dW1vcl9kZXNjcmlwdG9yX24+PTIpewogICAgdHVtb3JfZGVzY3JpcHRvcl9tb2RlbF9yZXN1bHRzIDwtIGdzdmFfYW5vdmFfdHVrZXkobWV0YWRhdGFfd2l0aF9nc3ZhLCB0dW1vcl9kZXNjcmlwdG9yLCBybmFfbGlicmFyeSwgU0lHTklGSUNBTkNFX1RIUkVTSE9MRCkgCiAgCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgIAogICAgIyB3cml0ZSBvdXQgcmVzdWx0cwogICAgcmVhZHI6OndyaXRlX3Rzdih0dW1vcl9kZXNjcmlwdG9yX21vZGVsX3Jlc3VsdHNbWyJhbm92YSJdXSwgdHVtb3JfZGVzY3JpcHRvcl9hbm92YV9vdXRwYXRoc1tbaV1dKQogICAgcmVhZHI6OndyaXRlX3Rzdih0dW1vcl9kZXNjcmlwdG9yX21vZGVsX3Jlc3VsdHNbWyJ0dWtleSJdXSwgdHVtb3JfZGVzY3JpcHRvcl90dWtleV9vdXRwYXRoc1tbaV1dKQogIAogICAgIyBwcmludCByZXN1bHRzIGZvciB2aWV3aW5nCiAgICBwcmludChybmFfbGlicmFyeSkKICAgIHByaW50KGhlYWQodHVtb3JfZGVzY3JpcHRvcl9tb2RlbF9yZXN1bHRzKSkKICAKICAgICMjIyMjIyMjIyMjIyMjIyMgcGxvdCByZXN1bHRzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAjIyMjIyMgYmFycGxvdHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgIyMjIHR1a2V5CiAgCiAgICB0ZF9tb2RlbHMgPC0gdW5pcXVlKGFzLmNoYXJhY3Rlcih0dW1vcl9kZXNjcmlwdG9yX21vZGVsX3Jlc3VsdHNbWyJ0dWtleSJdXSRjb21wYXJpc29uKSkKICAgIHRkX21vZGVscyA8LSBzb3J0KHRkX21vZGVscywgZGVjcmVhc2luZyA9IEZBTFNFKQogICAgcHJpbnQodGRfbW9kZWxzKQogIAogICAgZm9yKHQgaW4gc2VxX2Fsb25nKHRkX21vZGVscykpewogICAgICBwcmludCh0KQoKICAgICAgIyBSZS1vcmRlciBiYXJzCiAgICAgIGRmIDwtIHR1bW9yX2Rlc2NyaXB0b3JfbW9kZWxfcmVzdWx0c1tbInR1a2V5Il1dICU+JQogICAgICAgIGZpbHRlcihjb21wYXJpc29uID09IHRkX21vZGVsc1t0XSkKICAKICAgICAgZGYkaGFsbG1hcmtfbmFtZSA8LSBmYWN0b3IoZGYkaGFsbG1hcmtfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gcmV2KHVuaXF1ZShkZiRoYWxsbWFya19uYW1lW29yZGVyKGRmJHR1a2V5X3BfdmFsdWUsIGRlY3JlYXNpbmcgPSBUUlVFKV0pKSkgIyBGYWN0b3IgbGV2ZWxzIGluIGluY3JlYXNpbmcgb3JkZXIKCiAgCiAgICAgIG5hbWUgPC0gcGFzdGUwKHBsb3RzX2RpciwgIi8iLCAiZ3N2YV90dWtleV8iLCBybmFfbGlicmFyeV9saXN0W2ldLCAiLSIsIHRkX21vZGVsc1t0XSwgIi10dW1vcl9kZXNjcmlwdG9yX2JhcnBsb3QucGRmIikKICAgICAgcHJpbnQobmFtZSkKICAgICAgcCA8LSBjcmVhdGVfYmFycGxvdChkZiA9IGRmLAogICAgICAgICAgICAgICAgICAgICAgICAgIHlfdmFsdWUgPSBkZiR0dWtleV9wX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlX3ZhbHVlID0gInR1a2V5X3BfdmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJuYV9saWJyYXJ5ID0gcm5hX2xpYnJhcnlfbGlzdFtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF9tb2RlbF9pZCA9IHRkX21vZGVsc1t0XSkKICAgICAgcGRmKGZpbGUgPSBuYW1lLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMCkKICAgICAgcHJpbnQocCkKICAgICAgZGV2Lm9mZigpCiAgICAgIH0KICAKICAgICMjIyBhbm92YQogICAgbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsICJnc3ZhX2Fub3ZhXyIsIHJuYV9saWJyYXJ5X2xpc3RbaV0sICItdHVtb3JfZGVzY3JpcHRvcl9iYXJwbG90LnBkZiIpCiAgICBwcmludChuYW1lKQogIAogICAgIyBSZS1vcmRlciBiYXJzCiAgICBkZiA8LSB0dW1vcl9kZXNjcmlwdG9yX21vZGVsX3Jlc3VsdHNbWyJhbm92YSJdXQogICAgZGYkaGFsbG1hcmtfbmFtZSA8LSBmYWN0b3IoZGYkaGFsbG1hcmtfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHJldih1bmlxdWUoZGYkaGFsbG1hcmtfbmFtZVtvcmRlcihkZiRhbm92YV9wX3ZhbHVlLCBkZWNyZWFzaW5nID0gVFJVRSldKSkpICMgRmFjdG9yIGxldmVscyBpbiBpbmNyZWFzaW5nIG9yZGVyCiAgICBwIDwtIGNyZWF0ZV9iYXJwbG90KGRmID0gZGYsCiAgICAgICAgICAgICAgICAgICAgICAgIHlfdmFsdWUgPSBkZiRhbm92YV9wX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZV92YWx1ZSA9ICJhbm92YV9wX3ZhbHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHJuYV9saWJyYXJ5ID0gcm5hX2xpYnJhcnlfbGlzdFtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgdGRfbW9kZWxfaWQgPSBOVUxMKQogICAgcGRmKGZpbGUgPSBuYW1lLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMCkKICAgIHByaW50KHApCiAgICBkZXYub2ZmKCkKICAKICAgICMjIyMjIyBkb3QgcGxvdHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgIyMjIHR1a2V5CiAgICB0ZF9tb2RlbHMgPC0gdW5pcXVlKGFzLmNoYXJhY3Rlcih0dW1vcl9kZXNjcmlwdG9yX21vZGVsX3Jlc3VsdHNbWyJ0dWtleSJdXSRjb21wYXJpc29uKSkKICAgIHRkX21vZGVscyA8LSBzb3J0KHRkX21vZGVscywgZGVjcmVhc2luZyA9IEZBTFNFKQogICAgcHJpbnQodGRfbW9kZWxzKQogIAogICAgZm9yKHQgaW4gc2VxX2Fsb25nKHRkX21vZGVscykpewogICAgICBwcmludCh0KQoKICAgICAgIyBSZS1vcmRlciBiYXJzCiAgICAgIGRmIDwtIHR1bW9yX2Rlc2NyaXB0b3JfbW9kZWxfcmVzdWx0c1tbInR1a2V5Il1dICU+JQogICAgICAgIGZpbHRlcihjb21wYXJpc29uID09IHRkX21vZGVsc1t0XSkKICAKICAgICAgbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsICJnc3ZhX3R1a2V5XyIsIHJuYV9saWJyYXJ5X2xpc3RbaV0sICItIiwgdGRfbW9kZWxzW3RdLCAiLXR1bW9yX2Rlc2NyaXB0b3JfZG90cGxvdC5wZGYiKQogICAgICBwcmludChuYW1lKQogICAgICBwIDwtIGNyZWF0ZV9kb3RwbG90KGRmID0gZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgeF92YWx1ZSA9IGRmJGhhbGxtYXJrX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgeV92YWx1ZSA9IGRmJHR1a2V5X3BfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVfdmFsdWUgPSAidHVrZXlfcF92YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcm5hX2xpYnJhcnkgPSBybmFfbGlicmFyeV9saXN0W2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRkX21vZGVsX2lkID0gdGRfbW9kZWxzW3RdKQogICAgICBwZGYoZmlsZSA9IG5hbWUsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwKQogICAgICBwcmludChwKQogICAgICBkZXYub2ZmKCkKICAgICAgfQogICAgCiAgICAjIyMgYW5vdmEKICAgIG5hbWUgPC0gcGFzdGUwKHBsb3RzX2RpciwgIi8iLCAiZ3N2YV9hbm92YV8iLCBybmFfbGlicmFyeSwgIi10dW1vcl9kZXNjcmlwdG9yX2RvdHBsb3QucGRmIikKICAgIHByaW50KG5hbWUpCiAgICBwIDwtIGNyZWF0ZV9kb3RwbG90KGRmID0gdHVtb3JfZGVzY3JpcHRvcl9tb2RlbF9yZXN1bHRzW1siYW5vdmEiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHhfdmFsdWUgPSB0dW1vcl9kZXNjcmlwdG9yX21vZGVsX3Jlc3VsdHNbWyJhbm92YSJdXSRoYWxsbWFya19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICB5X3ZhbHVlID0gdHVtb3JfZGVzY3JpcHRvcl9tb2RlbF9yZXN1bHRzW1siYW5vdmEiXV0kYW5vdmFfcF92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVfdmFsdWUgPSAiYW5vdmFfcF92YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJuYV9saWJyYXJ5ID0gcm5hX2xpYnJhcnlfbGlzdFtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgdGRfbW9kZWxfaWQgPSBOVUxMKQogICAgcGRmKGZpbGUgPSBuYW1lLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMCkKICAgIHByaW50KHApCiAgICBkZXYub2ZmKCkKICAgIH0KfQpgYGAKCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAKCg==